package com.sxt.server.handle;

import com.sxt.server.common.model.Jt808Msg;
import com.sxt.server.service.RedisPublisher;
import com.sxt.server.util.NettySession;


//import org.springframework.web.client.RestTemplate;
import com.sxt.server.common.JT808Const;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Jt808MsgHandle extends ChannelInboundHandlerAdapter {
	
	private RedisPublisher redisPublisher;
	//RestTemplate应用方式一
	//@Autowired 由于使用了线程池，所以无法加载
	//private RestTemplate restTemplate;//这样就可以直接调用api使用了或者直接new对象也一样
	//RestTemplate应用方式二
	//@Autowired 无法加载
	//private RestClient restClient = new RestClient();
	
	//private String url = "http://localhost:8000/websocket/sendAll?message='位置信息汇报' ";
	
	public Jt808MsgHandle(RedisPublisher publisher) {
		// TODO Auto-generated constructor stub
		this.redisPublisher = publisher;
	}

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

		log.info("收到Jt808Msg={}", msg);
		Jt808Msg jt808Msg = (Jt808Msg) msg;
		short msgId = jt808Msg.getMsgHeader().getMsgId();
		switch (msgId) {
        case JT808Const.TERNIMAL_MSG_HEARTBEAT:
            //packet = new HeartBeatMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
        	log.info("终端心跳");
    		ctx.writeAndFlush("终端心跳");
            break;
        case JT808Const.TERNIMAL_MSG_LOCATION:
            
			//String message = "位置信息汇报";
			
			//packet = new LocationMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
			//Map<String,Object> param = new HashMap<>();
			//param.put("message",message);
			this.redisPublisher.pushMessage("topic1", jt808Msg);
        	//log.info("位置信息汇报");
    		//ctx.writeAndFlush("位置信息汇报");
            break;
        case JT808Const.TERNIMAL_MSG_REGISTER:
            //packet = new RegisterMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
        	log.info("终端注册");
    		ctx.writeAndFlush("终端注册");
            break;
        case JT808Const.TERNIMAL_MSG_AUTH:
            //packet = new AuthMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
        	log.info("终端鉴权");
    		ctx.writeAndFlush("终端鉴权");
            break;
        case JT808Const.TERNIMAL_MSG_LOGOUT:
            //packet = new LogOutMsg(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
        	log.info("终端注销");
    		ctx.writeAndFlush("终端注销");
            break;
        default:
           // packet = new DataPacket(bb);
        	// 我们调用writeAndFlush（Object）来逐字写入接收到的消息并刷新线路
        	log.info("其他信息汇报");
    		ctx.writeAndFlush("");
            break;
    }
		
		String sessionID = jt808Msg.getMsgHeader().getTerminalPhone();

		// 保存客户端与 Channel 之间的关系
		 NettySession.put(sessionID, ctx.channel());
	}

	/**
	 * 取消绑定
	 * 
	 * @param ctx
	 * @throws Exception
	 */
	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		NettySession.remove(ctx.channel());
	}

	@Override
	public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
		if (evt instanceof IdleStateEvent) {
			IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
			if (idleStateEvent.state() == IdleState.READER_IDLE) {
				log.info("已经50秒没有收到信息！");
				// 向客户端发送消息
			}
		}
		super.userEventTriggered(ctx, evt);
	}
}
